package com.idc.resource.help;

import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.concurrent.TimeUnit;

/**
 * redis队列处理
 */
@Repository("redisRepository")
@SuppressWarnings({"rawtypes","unchecked"})
public class RedisQueueHelp {
    /** 队列过期时间 */
    private static long ENQUEUE_TIME_OUT = 30*60;
    /** 出队列等待时间(阻塞) */
    private static long DEQUEUE_TIME_OUT = 1*60;
	@Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 入队<br>
     * 默认过期时间(1800秒)
     * @param key 队列名称
     * @param value 值
     * @return 入队位置
     */
	public Long enqueue(String key, String value) {
		Long result = redisTemplate.opsForList().rightPush(key, value);
		expire(key, ENQUEUE_TIME_OUT);
		return result;
    }

    /**
     * 入队<br>
     * 默认过期时间(3000秒)
     * @param key key
     * @param value value
     * @return 入队位置
     */
    public Long enqueue(String key, Object value) {
        String jsonVale = JSONObject.toJSONString(value);
        Long result = redisTemplate.opsForList().rightPush(key, jsonVale);
        expire(key, ENQUEUE_TIME_OUT);
        return result;
    }
	
	/**
	 * 入队可设置过期时间
	 * @param key key
	 * @param value value
     * @param expireTime 过期时间(秒)
	 * @return 入队位置
	 */
	public Long enqueue(String key, String value, long expireTime) {
		Long result = redisTemplate.opsForList().rightPush(key, value);
		expire(key, expireTime);
		return result;
	}

    /**
     * 队列过期
     * @param key 队列key
     * @param expireTime 过期时间(秒)
     * @return 队列是否已过期
     */
    public boolean expire(String key,long expireTime) {
        return redisTemplate.expire(key,expireTime,TimeUnit.SECONDS);
    }

    /**
     * 出队(不阻塞)
     * 无消息直接返回null
     * @param key 队列key
     * @return 队列值
     */
    public String dequeueNow(String key) {
        return (String)redisTemplate.opsForList().rightPop(key);
    }

    /**
     * 出队(不阻塞)
     * 无消息直接返回null
     * @param key 队列key
     * @return 队列值
     */
    public Object dequeueObjectNow(String key) {
        return redisTemplate.opsForList().rightPop(key);
    }

    /**
     * 出队(超时阻塞)
     * @param key key
     * @param timeout 设置等待时间,0为一直等待
     * @param timeUnit 时间工具
     * @return 结果
     */
    public String dequeue(String key, long timeout, TimeUnit timeUnit) {
        return redisTemplate.opsForList().rightPop(key,timeout, TimeUnit.SECONDS);
    }

    /**
     * 出队(超时阻塞)
     * @param key key
     * @param timeout 设置等待时间(秒),0为一直等待
     * @return 结果
     */
    public String dequeue(String key, long timeout) {
    	return dequeue(key, timeout, TimeUnit.SECONDS);
    }
    
    /**
     * 出队(超时阻塞)<br>
     * 默认等待时间(60秒)
     * @param key key
     * @return 结果
     */
    public String dequeue(String key) {
        return dequeue(key, DEQUEUE_TIME_OUT, TimeUnit.SECONDS);
    }
}